package com.zx._01_基础.浅拷贝and深拷贝.deep;

/**
 * Java的clone()方法（官方翻译）
 *
 * Class Object{
 * protected native Object clone() throws CloneNotSupportedException;
 * }
 * 1. clone方法将对象复制了一份并返回给调用者。一般而言，clone（）方法满足：
 * 对任何的对象x，都有x.clone() !=x//克隆对象与原对象不是同一个对象
 * 对任何的对象x，都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
 * 如果对象x的equals()方法定义恰当，那么x.clone().equals(x)应该成立。
 *
 * 2. Java中对象的克隆
 * 为了获取对象的一份拷贝，我们可以利用Object类的clone()方法。
 * 在派生类中覆盖基类的clone()方法，并声明为public。
 * 在派生类的clone()方法中，调用super.clone()。
 * 在派生类中实现Cloneable接口。
 */
public class Main {

    /**
     * 深复制演示
     *
     * @param args
     * @throws CloneNotSupportedException
     * @Description: 深复制（深克隆）
     *         被复制对象的所有变量都含有与原来的对象相同的值，除去那些引用其他对象的变量。
     *         那些引用其他对象的变量将指向被复制过的新对象，而不再是原有的那些被引用的对象。
     *         换言之，深复制把要复制的对象所引用的对象都复制了一遍
     * @date: 2018年4月14日下午10:28:13
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        User u1 = new User(1, new Name("大名", "小名"));
        System.out.println("原对象:\t\t" + u1);

        User u2 = (User) u1.clone();
        System.out.println("复制获得:\t" + u2);

        System.out.println("u1==u2 : " + u1.equals(u2));

        System.out.println("修改原对象FirstName=2333");
        u1.getName().setFirstName("2333");

        System.out.println("修改后原对象:\t" + u1);
        System.out.println("修改后复制的对象:\t" + u2);
    }

}
